package com.itheima.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.bean.PageParam;
import com.itheima.bean.R;
import com.itheima.bean.Setmeal;
import com.itheima.dto.SetmealDto;
import com.itheima.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/*
    处理套餐相关请求
 */
@RestController
public class SetmealController {
    @Autowired
    private SetMealService ss;

    /**
     * 添加套餐
     * @param setmealDto
     * @return
     */
    //后台添加一种套餐的时候，需要把这种类型的套餐给删除掉
    @CacheEvict(value = "setmealCache",key = "'setmeal_'+#setmealDto.categoryId + '_' + #setmealDto.status")
    @PostMapping("/setmeal")
    public R add(@RequestBody SetmealDto setmealDto){
        //1、调用service
        int row = ss.add(setmealDto);

        //2、判定
        if (row > 0){
            return R.success("添加套餐成功");
        } else {
            return R.error("添加套餐失败");
        }
    }

    /**
     * 删除套餐
     * @param 这里瞎几把写  ids 页面可能执行单个删除，也可能执行批量删除，过来的id数量不确定，所以这里可以使用数组来接收，也可以使用集合来接收
     *            但是使用集合来接收，需要在前面加上@RequestParam ，即表示要求要把指定名称的参数全部填充到集合里面
     * @return
     *
     */
    /*
        在后台把一种套餐删除掉，那么也需要去更新缓存，有两种做法：
        1、把Redis里面这种类型的套餐数据给删除掉。
            比如： 后台删除了一种套餐，关爱老年人套餐 --- 阳光套餐少了一个数据，此时要删除Redis里面的阳光套餐类型的数据
        2、把后台所有的套餐数据全部给删除除掉。
            allEntries：用来决定是否把setmealCache这种大分类下的所有缓存全部删除掉。
                true: 全部删除除掉 套餐缓存数据
                false: 表示不删除全部的数据，只有KEY匹配了才会删除其中的某一条数据。。

                如果希望删除掉多个KEY，怎么写？
                @Caching(evict = {@CacheEvict(value = "",key = ""),@CacheEvict(value = "", key = "")})

     */
    @CacheEvict(value = "setmealCache",allEntries = true)
    @DeleteMapping("/setmeal")
    public R delete(@RequestParam("ids") List<Long> 这里瞎几把写){
        System.out.println("这里瞎几把写 = " + 这里瞎几把写);
        //1、调用service
        int row = ss.delete(这里瞎几把写);

        if (row > 0){
            return R.success("删除套餐成功");
        } else {
            return R.error("删除套餐失败");
        }
    }

    /**
     * 分页查询
     * @param pageParam
     * @return
     */
    @GetMapping("/setmeal/page")
    public R findPage(PageParam pageParam){
        //1、调用service
        IPage<SetmealDto> page = ss.findPage(pageParam);
        try {
            return R.success(page);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("分页查询失败");
        }
    }

    /**
     * 根据分类来查询套餐数据
     * @param categoryId 分类id
     * @param status 状态： 在售 1，停售 0
     * @return
     */
    //使用上缓存，第一次查询的时候去数据库查询，然后回来之后，保存到Redis里面去，
    // 第二次查询就从Redis里面拿到结果返回给前端页面即可

    // key ： setmeal_13837894797823_1
    @Cacheable(value = "setmealCach",key = "#categoryId +'_'+ #status")
    @GetMapping("/setmeal/list")
    public R findByCategoryId(Long categoryId,int status){
        List<Setmeal> list = ss.findByCategoryId(categoryId,status);
        return R.success(list);
    }
}
